import numpy as np
#傅里叶模块
import scipy.fftpack as fftpack
# 将时域转换成频域
import matplotlib.pyplot as plt
%matplotlib inline
登月图片消噪
scipy.fftpack模块用来计算快速傅里叶变换
速度比传统傅里叶变换更快,是对之前算法的改进
图片是二维数据,注意使用fftpack的二维转变方法
moon = plt.imread('moonlanding.png')
plt.figure(figsize=(12,9))
plt.imshow(moon,cmap='gray')
### 噪声----频率高
#使用傅里叶从时域---》频域-----》过滤碍眼的高频波
moon.shape
moon_fft = fftpack.fft2(moon)
moon_fft
cond = np.abs(moon_fft)>1e3
# 高频波过滤掉
moon_fft[cond] = 0
# 傅里叶反转
moon_result = fftpack.ifft2(moon_fft)
moon_result
moon_result = np.real(moon_result)
moon_result
plt.figure(figsize=(12,9))
plt.imshow(moon_result,cmap='gray')
数值积分,求解圆周率
求解圆周率
integrate 对函数(1 - x^2)^0.5进行积分
x = np.linspace(-1,1,1000)
f = lambda x: (1-x**2)**0.5
# 画一个圆
plt.figure(figsize=(4,4))
plt.plot(x,f(x))
plt.plot(x,-f(x))
圆的面积是?
使用scipy.integrate进行积分,调用quad()方法
import scipy.integrate as integrate
square,error = integrate.quad(f,-1,1)
print('圆周率是%s,误差%s'%(square*2,error))
Scipy文件输入/输出
import scipy.io as io
随机生成数组,使用scipy中的io.savemat()保存
文件格式是.mat,标准的二进制文件
# matrix 矩阵
# mat标准的二进制文件
# matlab软件,非常强大
io.savemat('daata.mat',mdict={'python':np.random.randint(1,9,size=(4,5))})
使用io.loadmat()读取数据
data = io.loadmat('./daata.mat')
data['python']
读写图片使用scipy中misc.imread()/imsave()
import scipy.misc as misc
import scipy as scipy
scipy.__version__
cat = misc.imread('./cat.jpg')
cat
misc.imshow(cat)
misc旋转、resize、imfilter
cat_rotate = misc.imrotate(cat,60)
cat_rotate
misc.imshow(cat_rotate)
cat_resize = misc.imresize(cat,size=50)
misc.imshow(cat_resize)
# 第二个参数表示风格
cat_filter = misc.imfilter(cat,'emboss')
misc.imshow(cat_filter)
使用scipy.misc.face(gray=True)获取图片,使用ndimage移动坐标、旋转图片、切割图片、缩放图片
导包,读取图片显示图片
import scipy.ndimage as ndimage
# scipy提供了一张模板图片
face = misc.face(gray=True)
print(type(face))
# plt.imshow(face.mean(axis=-1),cmap='gray')
plt.imshow(face,cmap='gray')
shift移动坐标
face1 = ndimage.shift(face,shift=[100,200,0])
plt.imshow(face1,cmap='gray')
face1 = ndimage.shift(face,shift=[100,200,0],cval=255)
plt.imshow(face1,cmap='gray')
'''mode : str, optional
Points outside the boundaries of the input are filled according
to the given mode ('constant', 'nearest', 'reflect', 'mirror' or 'wrap').
Default is 'constant'.'''
face1 = ndimage.shift(face,shift=[380,0,1],mode='mirror')
plt.imshow(face1,cmap='gray')
zoom缩放图片
#旋转
face2 = ndimage.rotate(face,90)
plt.imshow(face2,cmap='gray')
face3 = ndimage.zoom(face,zoom=[0.5,0.3,1])
plt.imshow(face3,cmap='gray')
切割图片
face2 = ndimage.rotate(face,90)
plt.imshow(face2,cmap='gray')
face4 = face[:512,-512:]
plt.imshow(face4)
图片进行过滤
添加噪声,对噪声图片使用ndimage中的高斯滤波、中值滤波、signal中维纳滤波进行处理
使图片变清楚
moon = plt.imread('./moonlanding.png')
plt.figure(figsize=(12,9))
plt.imshow(moon,cmap='gray')
加载图片,使用灰色图片misc.face()添加噪声
plt.imshow(face4)
# 这个是对face的gray=True的情况做的操作
face5 = face+face.std() * np.random.randn(face.shape[0],face.shape[1]) * 0.3
# face5 = face+face.std()*np.random.randn(face.shape[0],face.shape[1])*0.3
plt.imshow(face5,cmap='gray')
face.shape[0]
face.shape[0]
face6 = ndimage.gaussian_filter(face5,sigma=1)
plt.figure(figsize=(12,4))
# 展示三章图片,一行3列
axes = plt.subplot(1,3,1)
axes.imshow(face4,cmap='gray')
axes = plt.subplot(1,3,2)
axes.imshow(face5,cmap='gray')
axes = plt.subplot(1,3,3)
axes.imshow(face6,cmap='gray')
高斯滤波sigma:高斯核的标准偏差
moon_gaussian = ndimage.gaussian_filter(moon,sigma=2.5)
plt.figure(figsize=(12,9))
plt.imshow(moon_gaussian,cmap='gray')
中值滤波参数size:给出在每个元素上从输入数组中取出的形状位置,定义过滤器功能的输入
face7 = ndimage.median_filter(face5,size=5)
plt.figure(figsize=(12,4))
# 展示三章图片,一行3列
axes = plt.subplot(1,3,1)
axes.imshow(face4,cmap='gray')
axes = plt.subplot(1,3,2)
axes.imshow(face5,cmap='gray')
axes = plt.subplot(1,3,3)
axes.imshow(face7,cmap='gray')
signal维纳滤波mysize:滤镜尺寸的标量
import scipy.signal as signal
face8 = signal.wiener(face5,mysize=5)
plt.figure(figsize=(12,4))
# 展示三章图片,一行3列
# 参数会自动将数值隔开
axes = plt.subplot(131)
axes.imshow(face4,cmap='gray')
axes = plt.subplot(132)
axes.imshow(face5,cmap='gray')
axes = plt.subplot(133)
axes.imshow(face8,cmap='gray')